package com.huaxin.dss2.message;

import com.huaxin.dss2.data.DataService;
import com.huaxin.dss2.data.dao.MySQLDataDao;
import com.huaxin.dss2.data.dao.OrgDataSource;
import com.huaxin.dss2.message.bean.DataMsgBean;
import com.huaxin.dss2.message.exception.SaveRealDataException;
import com.huaxin.dss2.util.ScheduledValue;
import java.sql.SQLException;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

/**
 *
 * @author likai
 * @date 2017/7/27
 */
@Component
@Slf4j
public class DssScheduled{

    @Autowired
    private DataService dataService;

    @Autowired
    private MessageCache messageCache;

    /**
     * 刷新站点集合
     */
    @Async
    @PostConstruct
    public void updateStationCode(){
        ScheduledValue.STATION_CODE_LIST = dataService.findSmallStationCodes();
    }

    /**
     * 定时存入缓存
     */
    public void saveCache() {
        //获取所有需要实时值的站点集合
        List<String> sStationCodes = ScheduledValue.STATION_CODE_LIST;
        if (!ScheduledValue.getIFinishStart()){
            return;
        }
        Map<String,DataMsgBean> dataMsgBeans = new ConcurrentHashMap<>();
        for (String s : sStationCodes) {
            try {
                //格式化数据格式
                DataMsgBean dataMsgBean = dataService.updateDataMsgBean(MessageParser.parseSmall(s));
                if (dataMsgBean != null) {
                    //存入缓存
                    //messageCache.putToCache(dataMsgBean);
                    //2019/6/6增加到redis缓存
                    dataMsgBeans.put(dataMsgBean.getStationId(),dataMsgBean);
                }
            } catch (SaveRealDataException e) {
                e.printStackTrace();
            }
        }
        //2019/6/6存入到redis
        messageCache.putToRemoteCache(dataMsgBeans.values());
    }

    /**
     * 刷新盒子对应站点的监控点(指标)
     * 在嘉净的版本中 将厂家的一系列关于盒子和监控点操作集成到了平台中
     * 需要在平台上对盒子和监控点操作之后数据能及时更新
     */
    public void flushBox(){
        dataService.flushBox();
    }

    /**
     * 每个月最后一天刷新表分区，仅历史数据源为mysql时才支持
     * 由于@Scheduled不支持 0 0 0 L * ？ 这种方式来定最后一天
     * 将所有可能的最后一天都执行一遍，在方法中判断是否是最后一天
     */
//    public void alterTablePart(){
//
//        Calendar instance = Calendar.getInstance();
//        int curr = instance.get(Calendar.DAY_OF_MONTH);
//        int maximum = instance.getActualMaximum(Calendar.DAY_OF_MONTH);
//
//        //判断是不是最后一天
//        if (curr!=maximum){
//            return;
//        }
//
//        Map<String, JdbcTemplate> jdbcTemplateMap = OrgDataSource.getJdbcTemplateMap();
//        for (Map.Entry<String,JdbcTemplate> entry : jdbcTemplateMap.entrySet()){
//            JdbcTemplate dataSource = entry.getValue();
//            String dataCode = entry.getKey();
//            MySQLDataDao.alterTablePart(dataSource,dataCode);
//        }
//    }

    /**
     * 定时存入数据库
     */
    public void saveHistory() {
        log.info("历史值存储定时开始存储执行");
        List<String> sStationCodes = ScheduledValue.STATION_CODE_LIST;
        for (String s : sStationCodes) {
                try {
                    DataMsgBean dataMsgBean = dataService.updateDataMsgBean(MessageParser.parseSmall(s));
                    if (dataMsgBean != null) {
                        try {
                            dataService.save(dataMsgBean);
                        } catch (SQLException e) {
                            log.error("数据库连接异常",e);
                        } catch (Exception e) {
                            log.error("保存数据出现异常",e);
                        }
                    }
                } catch (SaveRealDataException e) {
                    log.error("SaveRealDataException:",e);
                }
        }
        log.info("储存结束");

    }
}
